package com.shujia.wyh.day13.studenttest1;

/*
    生产者消费者模型：使用java程序模拟生产者消费者问题中的等待唤醒机制。
    生产者线程，消费者线程，共享数据，测试类。
    ProductThread：对Student对象进行赋值
    ConsumerThread：取出Studen对象的成员变量值
    Student(姓名，年龄)
    测试类：创建多线程环境进行演示

    问题1：我们按照需求。以最简单实现了代码程序，运行后发现，结果永远是null---0
        经过分析后发现生产者和消费者都有自己的学生对象，以至于生产者生产是自己的学生对象，消费者消费的是自己的学生对象
        不是共享的。
        解决方案：可以在外部创建出学生对象，以构造方法的形式传入到生产者和消费者。

    问题2：我们将学生对象修改成了生产者消费者共享的数据后，新的问题又出现了。如果消费者线程先执行的话，打印的依旧是默认值。
        解决方案：为了更好的观察结果，我们尝试加入赋不同的值，循环赋值取值

    问题3：我们加入赋不同的值，循环赋值取值后，出现了姓名和年龄对应不上的情况。
        出现了线程安全的问题：
        1. 是否存在多线程环境？是
        2. 是否存在共享变量？是
        3. 是否有多条语句操作着共享变量？是
        解决方案：
            1）synchronized关键字
            2）Lock锁

    问题4：即使我们解决了线程安全的问题，依旧会出现第一次输出的时候可能会出现null---0
        解决方案：加入等待唤醒机制。


 */
public class Test5 {
    public static void main(String[] args) {
        Student student = new Student();
        //创建生产者线程对象
        ProductThread productThread = new ProductThread(student);
        //创建消费者线程对象
        ConsumerThread consumerThread = new ConsumerThread(student);

        //启动线程
        productThread.start();
        consumerThread.start();

    }
}
